home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sprite 1984 - 1993
/
Sprite 1984 - 1993.iso
/
src
/
machserver
/
1.098
/
recov
/
recov.h
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-30
|
9KB
|
230 lines
/*
* recov.h --
*
* External definitions needed by users of the Recovery system.
* This module maintains up/down state about other hosts, provides
* a call-back mechanism for other modules, and some state bits
* that can also be set by other modules.
*
* Copyright (C) 1985 Regents of the University of California
* All rights reserved.
*
*
* $Header: /sprite/src/kernel/recov/RCS/recov.h,v 9.15 90/11/29 23:04:05 kupfer Exp $ SPRITE (Berkeley)
*/
#ifndef _RECOV
#define _RECOV
#ifdef KERNEL
#include <trace.h>
#include <proc.h>
#else
#include <kernel/trace.h>
#include <kernel/proc.h>
#endif
/*
* External view of the state kept about each host.
*/
typedef struct Recov_State {
int spriteID; /* Host ID of the peer */
unsigned int bootID; /* Boot timestamp from RPC header */
int state; /* Recovery state, defined below */
int clientState; /* Client bits */
Time time; /* Time of last message */
} Recov_State;
/*
* recov_PrintLevel defines how noisey we are about other hosts.
* Values for the print level should be defined in increasing order.
*/
#define RECOV_PRINT_NONE 0
#define RECOV_PRINT_REBOOT 1
#define RECOV_PRINT_IF_UP 2
#define RECOV_PRINT_CRASH 2
#define RECOV_PRINT_ALL 10
extern int recov_PrintLevel;
/*
* Host state used by the recov module and accessible via the
* Recov_{G,S}etHostState calls:
* RECOV_STATE_UNKNOWN Initial state.
* RECOV_HOST_ALIVE Set when we receive a message from the host
* RECOV_HOST_DYING Set when an RPC times out.
* RECOV_HOST_DEAD Set when crash callbacks have been started.
* RECOV_HOST_BOOTING Set in the limbo period when a host is booting
* and talking to the world, but isn't ready
* for full recovery actions yet.
*
* RECOV_CRASH_CALLBACKS Set during the crash call-backs, this is used
* to block RPC server processes until the
* crash recovery actions have completed.
* RECOV_WANT_RECOVERY Set if another module wants a callback at reboot
* RECOV_PINGING_HOST Set for hosts we ping to see when it reboots.
* RECOV_REBOOT_CALLBACKS Set while reboot callbacks are pending.
* RECOV_FAILURE Set if a communication failure occurs during
* the reboot callbacks. This triggers another
* invokation of the reboot callbacks so that
* a client can't miss out on recovery.
*
* RECOV_CRASH artificial state to trace RecovCrashCallBacks
* RECOV_REBOOT artificial state to trace RecovRebootCallBacks
*/
#define RECOV_STATE_UNKNOWN 0x0
#define RECOV_HOST_ALIVE 0x1
#define RECOV_HOST_DYING 0x2
#define RECOV_HOST_DEAD 0x4
#define RECOV_HOST_BOOTING 0x10
#define RECOV_CRASH 0x20
#define RECOV_REBOOT 0x40
#define RECOV_FAILURE 0x80
#define RECOV_CRASH_CALLBACKS 0x0100
#define RECOV_WANT_RECOVERY 0x0200
#define RECOV_PINGING_HOST 0x0400
#define RECOV_REBOOT_CALLBACKS 0x0800
/*
* If dying_state is not defined then crash callbacks are made
* immidiately after a timeout. Otherwise the host lingers in
* the RECOV_HOST_DYING state for recov_CrashDelay seconds.
*/
#undef dying_state
/*
* Host state flags for use by Recov clients. These flags are set
* by users of the Recov module to define/get host states beyond
* the simple up/down state maintained by the Recov system.
* CLT_RECOV_IN_PROGESS The client has crashed and needs to go
* through full recovery. This is set when
* we detect a crash, and reset after the
* client tells us it's done re-opening files.
* SRV_RECOV_IN_PROGRESS This is set on a client while it is reopening
* files in order to ensure only one set of
* reopens is in process.
* SRV_RECOV_FAILED Recovery with the server failed. This is
* used to catch a race between the end of
* a failed recovery and re-establishing contact
* with the server. If the server "comes back"
* before a failed recovery clears the
* SRV_RECOV_IN_PROGRESS bit, then a reboot
* callback could get lost. This bit is used
* to detect this.
*/
#define CLT_RECOV_IN_PROGRESS 0x1
#define SRV_RECOV_IN_PROGRESS 0x2
#define SRV_RECOV_FAILED 0x4
/*
* Whether or not to use absolute intervals for pinging servers. The default
* is to use them in order to avoid synchronizing clients due to server
* reboots.
*/
extern Boolean recov_AbsoluteIntervals;
/*
* Trace types for use with Recov_HostTrace. Compatible with recov.h bits.
* RECOV_TRACE_FS_STALE A stale handle was returned from a file server
*/
#define RECOV_TRACE_FS_STALE 0x1000
/*
* A trace is kept for debugging/understanding the host state transisions.
*/
typedef struct RecovTraceRecord {
int spriteID; /* Host ID whose state changed */
int state; /* Their new state */
} RecovTraceRecord;
/*
* Tracing events, these describe the trace record.
*
* RECOV_CUZ_WAIT Wait in Recov_WaitForHost
* RECOV_CUZ_WAKEUP Wakeup in Recov_WaitForHost
* RECOV_CUZ_INIT First time we were interested in the host
* RECOV_CUZ_REBOOT We detected a reboot
* RECOV_CUZ_CRASH We detected a crash
* RECOV_CUZ_DONE Recovery actions completed
* RECOV_CUZ_PING_CHK We are pinging the host to check it out
* RECOV_CUZ_PING_ASK We are pinging the host because we were asked
* RECOV_CUZ_CRASH_UNDETECTED Crash wasn't detected until reboot
*/
#define RECOV_CUZ_WAIT 0x1
#define RECOV_CUZ_WAKEUP 0x2
#define RECOV_CUZ_INIT 0x4
#define RECOV_CUZ_REBOOT 0x8
#define RECOV_CUZ_CRASH 0x10
#define RECOV_CUZ_DONE 0x20
#define RECOV_CUZ_PING_CHK 0x40
#define RECOV_CUZ_PING_ASK 0x80
#define RECOV_CUZ_CRASH_UNDETECTED 0x100
#ifndef CLEAN
#define RECOV_TRACE(zspriteID, zstate, event) \
if (recovTracing) {\
RecovTraceRecord rec;\
rec.spriteID = zspriteID;\
rec.state = zstate;\
Trace_Insert(recovTraceHdrPtr, event, (ClientData)&rec);\
}
#else
#define RECOV_TRACE(zspriteID, zstate, event)
#endif /* not CLEAN */
extern Trace_Header *recovTraceHdrPtr;
extern Boolean recovTracing;
/*
* Statistics about the recovery module.
*/
typedef struct Recov_Stats {
int packets; /* Number of packets examined */
int pings; /* Number of pings made to check on other hosts */
int pingsSuppressed;/* Number of pings that were suppressed due to
* recent message traffic */
int timeouts; /* The number of timeout's detected */
int crashes; /* The number of times crash call-backs were called */
int nonCrashes; /* The number of times crash call-backs were avoided */
int reboots; /* The number of times reboot call-backs were called */
int numHostsPinged; /* The number of hosts being pinged */
} Recov_Stats;
extern Recov_Stats recov_Stats;
extern void Recov_Init _ARGS_((void));
extern void Recov_CrashRegister _ARGS_((void (*crashCallBackProc)(), ClientData crashData));
extern void Recov_RebootRegister _ARGS_((int spriteID, void (*rebootCallBackProc)(), ClientData rebootData));
extern void Recov_RebootUnRegister _ARGS_((int spriteID, void (*rebootCallBackProc)(), ClientData rebootData));
extern void Recov_HostAlive _ARGS_((int spriteID, unsigned int bootID, Boolean asyncRecovery, Boolean rpcNotActive));
extern void Recov_HostDead _ARGS_((int spriteID));
extern int Recov_GetHostState _ARGS_((int spriteID));
extern Boolean Recov_GetHostInfo _ARGS_((int spriteID, Recov_State *recovStatePtr));
extern ReturnStatus Recov_IsHostDown _ARGS_((int spriteID));
extern void Recov_HostTrace _ARGS_((int spriteID, int event));
extern int Recov_GetClientState _ARGS_((int spriteID));
extern int Recov_SetClientState _ARGS_((int spriteID, int stateBits));
extern void Recov_ClearClientState _ARGS_((int spriteID, int stateBits));
extern void Recov_AddHandleCountToClientState _ARGS_((int type, int clientID, ReturnStatus status));
extern void RecovRebootCallBacks _ARGS_((ClientData data, Proc_CallInfo *callInfoPtr));
extern ReturnStatus Recov_DumpClientRecovInfo _ARGS_((int length, Address resultPtr, int *lengthNeededPtr));
extern ReturnStatus Recov_GetStats _ARGS_((int size, Address userAddr));
extern ReturnStatus Recov_DumpState _ARGS_((int size, Address userAddr));
extern void Recov_ChangePrintLevel _ARGS_((int newLevel));
extern void RecovPingInit _ARGS_((void));
extern void RecovPrintPingList _ARGS_((void));
extern void Recov_PrintTrace _ARGS_((ClientData numRecs));
extern void Recov_PrintState _ARGS_((void));
extern int Recov_PrintTraceRecord _ARGS_((ClientData clientData, int event, Boolean printHeaderFlag));
extern void Recov_Proc _ARGS_((void));
extern void RecovAddHostToPing _ARGS_((int spriteID));
extern int RecovCheckHost _ARGS_((int spriteID));
extern int RecovGetLastHostState _ARGS_((int spriteID));
#endif /* _RECOV */